package com.zyf.project.kvdb.client.core;

import com.zyf.project.kvdb.protocol.exception.KVDBException;
import utils.binary.impl.Bytes;

/**
 * <h1>KVDB SDK 数据操作</h1>
 *
 * @author Zhou Yifan
 */
public interface KVDBOperator {

    /**
     * 存在性查询
     *
     * @param key 待查询的键
     * @return 布尔值
     * @throws KVDBException KVDB 可能存在的异常
     */
    boolean exists(Bytes key) throws KVDBException;

    /**
     * 存在性查询，支持多个键
     *
     * @param keys 待查询的键
     * @return 布尔值
     * @throws KVDBException KVDB 可能存在的异常
     */
    boolean[] exists(Bytes... keys) throws KVDBException;

    /**
     * 键值对获取
     *
     * @param key 键，{@link Bytes} 类型
     * @return 键对应的值，{@link Bytes} 类型
     * @throws KVDBException KVDB 可能存在的异常
     */
    Bytes get(Bytes key) throws KVDBException;

    /**
     * 键值对获取
     *
     * @param keys 键，{@link Bytes} 类型数组
     * @return 键对应的值，{@link Bytes} 类型数组
     * @throws KVDBException KVDB 可能存在的异常
     */
    Bytes[] get(Bytes... keys) throws KVDBException;

    /**
     * 设置键值对（添加）
     *
     * @param key   键
     * @param value 值
     * @return 布尔值
     * @throws KVDBException KVDB 可能存在的异常
     */
    boolean put(Bytes key, Bytes value) throws KVDBException;

    /**
     * 设置键值对（添加）
     *
     * @param key   键
     * @param value 值
     * @param async 是否异步（Promise 消息）
     * @return 布尔值
     * @throws KVDBException KVDB 可能存在的异常
     */
    boolean put(Bytes key, Bytes value, boolean async) throws KVDBException;

    /**
     * 开启批处理
     *
     * @return 布尔值
     * @throws KVDBException KVDB 可能存在的异常
     */
    boolean batchBegin() throws KVDBException;

    /**
     * 取消批处理
     *
     * @return 布尔值
     * @throws KVDBException KVDB 可能存在的异常
     */
    boolean batchAbort() throws KVDBException;

    /**
     * 提交批处理，服务器掉线重连后会丢失未提交的数据，未提交的 batch 对其他客户端连接而言是不可见的
     *
     * @return 布尔值
     * @throws KVDBException KVDB 可能存在的异常
     */
    boolean batchCommit() throws KVDBException;

    /**
     * 提交批处理
     *
     * @param size 此次批处理操作去重后的 key 数量
     * @return 布尔值
     * @throws KVDBException KVDB 可能存在的异常
     */
    boolean batchCommit(long size) throws KVDBException;

    /**
     * 关闭数据库
     */
    void close();

}
